www.gusucode.com > 连接 COM 与 .NET 的桥梁(三)——COM 服务器的 COM Interop 方式C++源码程序 > 连接 COM 与 .NET 的桥梁(三)——COM 服务器的 COM Interop 方式/comp6srcdnet3/代码/Code/DispConnect/UseMult_MFC/Sink.cpp
#include "StdAfx.h" #include ".\sink.h" CSink::CSink(void) : m_pEdit(NULL) { } CSink::~CSink(void) { } void CSink::SetResultWnd(CEdit * pEdit) { m_pEdit = pEdit; } // STDMETHODIMP 是宏,等价于 long __stdcall STDMETHODIMP CSink::QueryInterface(const struct _GUID &iid,void ** ppv) { *ppv=this; return S_OK; } ULONG __stdcall CSink::AddRef(void) { return 1; } // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的 ULONG __stdcall CSink::Release(void) { return 0; } // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的 STDMETHODIMP CSink::GetTypeInfoCount(unsigned int *) { return E_NOTIMPL; } // 不用实现,反正也不用 STDMETHODIMP CSink::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** ) { return E_NOTIMPL; } // 不用实现,反正也不用 STDMETHODIMP CSink::GetIDsOfNames(const IID &,LPOLESTR *,UINT,LCID,DISPID *) { return E_NOTIMPL; } // 不用实现,反正也不用 STDMETHODIMP CSink::Invoke( long dispID, const struct _GUID &, unsigned long, unsigned short, struct tagDISPPARAMS * pParams, struct tagVARIANT *, struct tagEXCEPINFO *, unsigned int *) { // 只需要实现这个就足够啦 switch(dispID) { case 1: //根据不同的dispID,完成不同的回调函数 if( !m_pEdit ) { AfxMessageBox( _T("没有调用 SetResultWnd() 设置显示结果的窗口") ); } else { CString str; str.Format( _T("%d"), pParams->rgvarg[0].lVal ); m_pEdit->SetWindowText( str ); } break; default: AfxMessageBox( _T("怎么可能,根本就没有这个号码的函数呀") ); break; } return S_OK; }